package com.sheng.leetcode.year2023.month10.day27;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author by ls
 * @date 2023/10/27
 * <p>
 * 1465. 切割后面积最大的蛋糕<p>
 * <p>
 * 矩形蛋糕的高度为 h 且宽度为 w，给你两个整数数组 horizontalCuts 和 verticalCuts，其中：<p>
 * horizontalCuts[i] 是从矩形蛋糕顶部到第  i 个水平切口的距离<p>
 * verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离<p>
 * 请你按数组 horizontalCuts 和 verticalCuts 中提供的水平和竖直位置切割后，<p>
 * 请你找出 面积最大 的那份蛋糕，并返回其 面积 。<p>
 * 由于答案可能是一个很大的数字，因此需要将结果 对 10^9 + 7 取余 后返回。<p>
 * <p>
 * 示例 1：<p>
 * 输入：h = 5, w = 4, horizontalCuts = [1,2,4], verticalCuts = [1,3]<p>
 * 输出：4<p>
 * 解释：上图所示的矩阵蛋糕中，红色线表示水平和竖直方向上的切口。切割蛋糕后，绿色的那份蛋糕面积最大。<p>
 * <p>
 * 示例 2：<p>
 * 输入：h = 5, w = 4, horizontalCuts = [3,1], verticalCuts = [1]<p>
 * 输出：6<p>
 * 解释：上图所示的矩阵蛋糕中，红色线表示水平和竖直方向上的切口。切割蛋糕后，绿色和黄色的两份蛋糕面积最大。<p>
 * <p>
 * 示例 3：<p>
 * 输入：h = 5, w = 4, horizontalCuts = [3], verticalCuts = [3]<p>
 * 输出：9<p>
 * <p>
 * 提示：<p>
 * 2 <= h, w <= 10^9<p>
 * 1 <= horizontalCuts.length <= min(h - 1, 10^5)<p>
 * 1 <= verticalCuts.length <= min(w - 1, 10^5)<p>
 * 1 <= horizontalCuts[i] < h<p>
 * 1 <= verticalCuts[i] < w<p>
 * 题目数据保证 horizontalCuts 中的所有元素各不相同<p>
 * 题目数据保证 verticalCuts 中的所有元素各不相同<p>
 */
public class LeetCode1465 {

    @Test
    public void test01() {
        int h = 5, w = 4;
//        int[] horizontalCuts = {1, 2, 4}, verticalCuts = {1, 3};
//        int[] horizontalCuts = {3, 1}, verticalCuts = {1};
        int[] horizontalCuts = {3}, verticalCuts = {3};
        System.out.println(new Solution().maxArea(h, w, horizontalCuts, verticalCuts));
    }
}

class Solution {
    public int maxArea(int h, int w, int[] horizontalCuts, int[] verticalCuts) {
        // 拿到分隔后长宽最大值，相乘即可
        Arrays.sort(horizontalCuts);
        Arrays.sort(verticalCuts);
        int h1 = 0;
        long maxh = 0;
        for (int horizontalCut : horizontalCuts) {
            maxh = Math.max(maxh, horizontalCut - h1);
            h1 = horizontalCut;
        }
        maxh = Math.max(maxh, h - h1);

        int v1 = 0;
        long maxv = 0;
        for (int verticalCut : verticalCuts) {
            maxv = Math.max(maxv, verticalCut - v1);
            v1 = verticalCut;
        }
        maxv = Math.max(maxv, w - v1);
        return (int) (maxh * maxv % 1000000007);
    }
}
